home *** CD-ROM | disk | FTP | other *** search
/ SGI Origin & Onyx2 Patches 1998 May / Origin and Onyx2 System Disk Patches May 1998.img / dist / patchSG0002370.idb / usr / etc / amdiag.z / amdiag
Text File  |  1997-09-04  |  10KB  |  378 lines

  1. #! /sbin/sh
  2. #
  3. #ident "$Revision: 1.6 $"
  4. #
  5. # amdiag -- live diagnosis reporting
  6. #
  7.  
  8. AMRVERSIONNUM=2.1
  9. AVAILDIR=/var/adm/avail
  10. SAVEDIR=$AVAILDIR/.save
  11. CONFIGDIR=$AVAILDIR/config
  12. USRETCDIR=/usr/etc
  13. OPTIONS=`cat /etc/config/savecore.options 2> /dev/null`
  14. CRASHDIR=""
  15. if [ "$OPTIONS" != "" ] ; then
  16.     for DIR in $OPTIONS ; do
  17.     if [ -d "$DIR" ] ; then
  18.         CRASHDIR=$DIR
  19.     fi
  20.     done
  21.     if [ "$CRASHDIR" = "" ] ; then
  22.     CRASHDIR=/var/adm/crash
  23.     fi
  24. else
  25.     CRASHDIR=/var/adm/crash
  26. fi
  27.  
  28. AMREGISTER=$USRETCDIR/amregister
  29. AMCONFIG=$USRETCDIR/amconfig
  30. AMSYSINFO=$USRETCDIR/amsysinfo
  31. AMNOTIFY=$USRETCDIR/amnotify
  32. AMSYSLOG=$USRETCDIR/amsyslog
  33. AMTIME1970=$USRETCDIR/amtime1970
  34. AMTICKERD=$USRETCDIR/amtickerd
  35.  
  36. TICKFILE=$AVAILDIR/lasttick
  37. TICKDURATION=300
  38.  
  39. SYSLOGFILE=/var/adm/SYSLOG
  40. OSYSLOGFILE=/var/adm/oSYSLOG
  41. LASTSYSLOG=$SAVEDIR/lastsyslog
  42.  
  43. LOGFILE=$AVAILDIR/availlog
  44. PREVSTARTFILE=$SAVEDIR/prevstart
  45. EVENTFILE=$SAVEDIR/event
  46.  
  47. SINCE1970=`$AMTIME1970`
  48. SINCE1970DATE=`$AMTIME1970 -d $SINCE1970`
  49. BOUND=-1
  50.  
  51. AUTOEMAIL=$CONFIGDIR/autoemail
  52. SHUTDOWNREASONFILE=$CONFIGDIR/shutdownreason
  53. TICKERDFILE=$CONFIGDIR/tickerd
  54. AUTOEMAILLIST=$CONFIGDIR/autoemail.list
  55.  
  56. AVAILREPFILE=$CRASHDIR/availreport
  57. DIAGREPFILE=$CRASHDIR/diagreport
  58.  
  59. TMPFILE=$CRASHDIR/tmpfile
  60. DIFFFILE=$CRASHDIR/difffile
  61. TMPSORTFILE=$CRASHDIR/tmpsortfile
  62.  
  63. PLATFORM=`uname -m`
  64.  
  65. comparefile() {
  66. # arg: $1 = saved configuration file
  67. #      $2 = configuration file to be compared
  68. # ret: 0 = files are different
  69. #      1 = $1 missing or files are the same
  70.  
  71.     if [ ! -f $SAVEDIR/$1 ] ; then
  72.     return 1
  73.     fi
  74.  
  75.     if [ ! -f $2 ] ; then
  76.     echo "System configureation file $2 is missing!!"
  77.     echo "Please try re-installing it"
  78.     logger -t availmon -p err -i availmon config file $2 is missing
  79.     return 1
  80.     fi
  81.  
  82.     diff $SAVEDIR/$1 $2 > /dev/null
  83.     if  [ $? -ne 0 ] ; then
  84.     return 0
  85.     else
  86.     return 1
  87.     fi
  88. }
  89.  
  90. compareandsavefile() {
  91. # arg: $1 = saved configuration file
  92. #      $2 = configuration file to be compared
  93. # ret: 0 = files are different
  94. #      1 = files are the same
  95.  
  96.     diff $SAVEDIR/$1 $2 > $DIFFFILE
  97.     if  [ $? -ne 0 ] ; then
  98.     cp $2 $SAVEDIR/$1
  99.     return 0
  100.     else
  101.     return 1
  102.     fi
  103. }
  104.  
  105. checkandappend() {
  106. # due to hinv's bug that cannot generate hinv output in a special
  107. # order, availmon needs to sort hinv's output and then compare with
  108. # saved sorted data
  109.  
  110.     if [ "$1" = "hinv" ] ; then
  111.     if [ -x $3 ] ; then
  112.         if [ ! -f $SAVEDIR/$1 ] ; then
  113.         touch $SAVEDIR/$1
  114.         fi
  115.         if [ ! -f $SAVEDIR/$1.sort ] ; then
  116.         touch $SAVEDIR/$1.sort
  117.         fi
  118.         $3 $4 $5 $6 $7 > $TMPFILE
  119.         sort $TMPFILE > $TMPSORTFILE
  120.         if compareandsavefile $1.sort $TMPSORTFILE ; then
  121.         NOINSTE=0
  122.         diff $SAVEDIR/$1 $TMPFILE > $DIFFFILE
  123.         cp $TMPFILE $SAVEDIR/$1
  124.         echo "$2|Begin" >> $DIAGREPFILE
  125.         cat $TMPFILE  >> $DIAGREPFILE
  126.         echo "$2|End" >> $DIAGREPFILE
  127.         echo "$2|Begin" >> $LOGFILE
  128.         cat $DIFFFILE  >> $LOGFILE
  129.         echo "$2|End" >> $LOGFILE
  130.         fi
  131.     fi
  132.     elif [ -x $3 ] ; then
  133.     if [ ! -f $SAVEDIR/$1 ] ; then
  134.         touch $SAVEDIR/$1
  135.     fi
  136.     $3 $4 $5 $6 $7 > $TMPFILE
  137.     if compareandsavefile $1 $TMPFILE ; then
  138.         NOINSTE=0
  139.         echo "$2|Begin" >> $DIAGREPFILE
  140.         cat $TMPFILE  >> $DIAGREPFILE
  141.         echo "$2|End" >> $DIAGREPFILE
  142.         echo "$2|Begin" >> $LOGFILE
  143.         cat $DIFFFILE  >> $LOGFILE
  144.         echo "$2|End" >> $LOGFILE
  145.     fi
  146.     fi
  147. }
  148.  
  149. #
  150. # check for improper installation and corruption
  151. #
  152.  
  153. if [ ! -d $AVAILDIR ] ; then
  154.     echo "\navailmon: cannot find directory $AVAILDIR"
  155.     echo "Please try re-installing availmon\n"
  156.     logger -t availmon -p err -i cannot find directory $AVAILDIR
  157.     exit
  158. elif [ ! -x $AMREGISTER -o ! -x $AMNOTIFY -o ! -x $AMSYSLOG \
  159.     -o ! -x $AMTICKERD -o ! -x $AMTIME1970 -o ! -x $AMSYSINFO \
  160.     -o ! -x $AMCONFIG ] ; then
  161.     echo "availmon: executable files corrupted"
  162.     echo "Please try re-installing availmon\n"
  163.     logger -t availmon -p err -i executable files corrupted
  164.     exit
  165. elif [ ! -d $SAVEDIR ] ; then
  166.     mkdir $SAVEDIR
  167.     if [ -f $CRASHDIR/bounds ] ; then
  168.     cp $CRASHDIR/bounds $SAVEDIR/bounds
  169.     else
  170.     echo "0" > $SAVEDIR/bounds
  171.     fi
  172.     $AMSYSINFO -s > $SAVEDIR/serialnum
  173.     $AMSYSINFO -n > $SAVEDIR/hostname
  174.     MSG=`$AMTIME1970 -i`
  175.     echo "PREV$MSG" > $PREVSTARTFILE
  176.     if [ -f $LOGFILE ] ; then
  177.     mv $LOGFILE $LOGFILE.O
  178.     fi
  179.     echo "$MSG" > $LOGFILE
  180.     if [ -f $SYSLOGFILE ] ; then
  181.     tail -1 $SYSLOGFILE > $LASTSYSLOG
  182.     fi
  183.     if [ -x /usr/bin/hinv ] ; then
  184.     /usr/bin/hinv -mvv > $SAVEDIR/hinv
  185.     fi
  186.     if [ -x /usr/sbin/versions ] ; then
  187.     /usr/sbin/versions -n eoe.sw.unix support.sw.fru "patchSG*" > $SAVEDIR/versions
  188.     fi
  189.     if [ -x /usr/gfx/gfxinfo ] ; then
  190.     /usr/gfx/gfxinfo -vv > $SAVEDIR/gfxinfo
  191.     fi
  192.     cp $CONFIGDIR/autoemail $SAVEDIR
  193.     cp $CONFIGDIR/autoemail.list $SAVEDIR
  194. fi
  195.  
  196. case $# in
  197.     1)
  198.     DIAGTYPE=$1
  199.     if [ "$DIAGTYPE" != "STATUS" ] ; then
  200.         echo "amdiag: incorrect argument number"
  201.         echo "Usage: amdiag <diag-type> <summary-file> <report-file>"
  202.         exit 1
  203.     fi
  204.     ;;
  205.     3)
  206.     DIAGTYPE=$1
  207.     SUMMARYFILE=$2
  208.     REPORTFILE=$3
  209.     ;;
  210.     *)
  211.     echo "amdiag: incorrect argument number"
  212.     echo "Usage: amdiag <diag-type> <summary-file> <report-file>"
  213.     exit 1
  214.     ;;
  215. esac
  216.  
  217. if [ "$DIAGTYPE" != "STATUS" ] ; then
  218.     if [ ! -r $SUMMARYFILE ] ; then
  219.         echo "amdiag: cannot access $SUMMARYFILE"
  220.     exit 1
  221.     fi
  222.     if [ ! -r $REPORTFILE ] ; then
  223.         echo "amdiag: cannot access $REPORTFILE"
  224.     exit 1
  225.     fi
  226. fi
  227.  
  228. LASTTICK=`cat $TICKFILE 2> /dev/null`
  229. LASTTICK=${LASTTICK:=-1}
  230. if [ $LASTTICK -ge 0 ] ; then
  231.     LASTTICKDATE=`$AMTIME1970 -d $LASTTICK`
  232. else
  233.     LASTTICKDATE="unknown"
  234. fi
  235.  
  236. if [ -f $SAVEDIR/autoemail ] ; then
  237.     if comparefile autoemail $CONFIGDIR/autoemail ; then
  238.     if $AMCONFIG autoemail -s ; then
  239.         $AMREGISTER -d -c $SAVEDIR/autoemail.list
  240.         cp $CONFIGDIR/autoemail $SAVEDIR/autoemail
  241.         cp $CONFIGDIR/autoemail.list $SAVEDIR/autoemail.list
  242.     else
  243.         $AMREGISTER -r -c $CONFIGDIR/autoemail.list
  244.         cp $CONFIGDIR/autoemail $SAVEDIR/autoemail
  245.         cp $CONFIGDIR/autoemail.list $SAVEDIR/autoemail.list
  246.     fi
  247.     else
  248.     if comparefile autoemail.list $CONFIGDIR/autoemail.list ; then
  249.         $AMCONFIG -k
  250.     fi
  251.     fi
  252. else
  253.     cp $CONFIGDIR/autoemail $SAVEDIR/autoemail
  254.     cp $CONFIGDIR/autoemail.list $SAVEDIR/autoemail.list
  255.     if $AMCONFIG autoemail ; then
  256.     $AMREGISTER -r
  257.     fi
  258. fi
  259.  
  260. if [ -f $SAVEDIR/serialnum ] ; then
  261.     SERIALNUM=`cat $SAVEDIR/serialnum`
  262. else
  263.     SERIALNUM=`$AMSYSINFO -s`
  264.     echo "$SERIALNUM" > $SAVEDIR/serialnum
  265. fi
  266. if [ -f $SAVEDIR/hostname ] ; then
  267.     HOSTNAME=`cat $SAVEDIR/hostname`
  268. else
  269.     HOSTNAME=`$AMSYSINFO -n`
  270.     echo "$HOSTNAME" > $SAVEDIR/hostname
  271. fi
  272.  
  273. echo "SERIALNUM|$SERIALNUM" > $AVAILREPFILE
  274. echo "SERIALNUM|$SERIALNUM" > $DIAGREPFILE
  275. echo "HOSTNAME|$HOSTNAME" >> $AVAILREPFILE
  276. echo "HOSTNAME|$HOSTNAME" >> $DIAGREPFILE
  277. echo "AMRVERSION|$AMRVERSIONNUM" >> $AVAILREPFILE
  278. echo "AMRVERSION|$AMRVERSIONNUM" >> $DIAGREPFILE
  279. echo "UNAME|`uname -a`" >> $AVAILREPFILE
  280. echo "UNAME|`uname -a`" >> $DIAGREPFILE
  281. if [ -f $PREVSTARTFILE ] ; then
  282.     cat $PREVSTARTFILE >> $AVAILREPFILE
  283.     cat $PREVSTARTFILE >> $DIAGREPFILE
  284. elif [ -f $LOGFILE ] ; then
  285.     MSG=`grep "^START|" $LOGFILE | tail -1`
  286.     echo "PREV$MSG" >> $AVAILREPFILE
  287.     echo "PREV$MSG" >> $DIAGREPFILE
  288.     echo "PREV$MSG" > $PREVSTARTFILE
  289. else
  290.     echo "\navailmon: availlog and saved data were corrupted!!"
  291.     echo "Please chech file system\n"
  292.     logger -t availmon -p err -i availlog and saved data were corrupted
  293.     MSG=`$AMTIME1970 -i`
  294.     echo "PREV$MSG" > $PREVSTARTFILE
  295.     echo "$MSG" > $LOGFILE
  296. fi
  297. if [ "$DIAGTYPE" != "STATUS" ] ; then
  298.     SUMMARYLINE=`head -2 $SUMMARYFILE | tail -1`
  299.     if echo $SUMMARYLINE | grep -i 'No error' > /dev/null ; then
  300.         EVENTCODE=-10
  301.     elif echo $SUMMARYLINE | grep -i 'No hardware error' > /dev/null ; then
  302.         EVENTCODE=-10
  303.     elif echo $SUMMARYLINE | grep -i 'Hardware error' > /dev/null ; then
  304.         EVENTCODE=-11
  305.     else
  306.         EVENTCODE=-12
  307.     fi
  308.     EVENTTIME=`awk '/TIME/ {print $2}' $SUMMARYFILE`
  309.     EVENTTIMEC=`awk '/TIME/ {print $3, $4, $5, $6, $7}' $SUMMARYFILE`
  310. else
  311.     EVENTCODE=-13
  312.     EVENTTIME=$SINCE1970
  313.     EVENTTIMEC=$SINCE1970DATE
  314. fi
  315.  
  316. MSG="EVENT|$EVENTCODE|$EVENTTIME|$EVENTTIMEC"
  317. echo "$MSG" >> $LOGFILE
  318. echo "$MSG" >> $AVAILREPFILE
  319. echo "$MSG" >> $DIAGREPFILE
  320. MSG="LASTTICK|$LASTTICK|$LASTTICKDATE"
  321. echo "$MSG" >> $AVAILREPFILE
  322. echo "$MSG" >> $DIAGREPFILE
  323. STATUSINTERVAL=`cat $CONFIGDIR/statusinterval 2> /dev/null`
  324. echo "STATUSINTERVAL|$STATUSINTERVAL" >> $AVAILREPFILE
  325. echo "STATUSINTERVAL|$STATUSINTERVAL" >> $DIAGREPFILE
  326.  
  327. NOINSTE=1
  328. if [ "$DIAGTYPE" != "STATUS" ] ; then
  329.     NOINSTE=0
  330.     echo -n "SUMMARY|Begin\n$DIAGTYPE\t" >> $LOGFILE
  331.     echo -n "SUMMARY|Begin\n$DIAGTYPE\t" >> $DIAGREPFILE
  332.     tail +2 $SUMMARYFILE >> $LOGFILE
  333.     tail +2 $SUMMARYFILE >> $DIAGREPFILE
  334.     echo "SUMMARY|End" >> $LOGFILE
  335.     echo "SUMMARY|End" >> $DIAGREPFILE
  336.  
  337.     echo "$DIAGTYPE|Begin" >> $DIAGREPFILE
  338.     cat $REPORTFILE >> $DIAGREPFILE
  339.     echo "$DIAGTYPE|End" >> $DIAGREPFILE
  340.     echo "SYSLOG|Begin" >> $DIAGREPFILE
  341.     $AMSYSLOG -S $SYSLOGFILE -O $OSYSLOGFILE | tail -700 >> $DIAGREPFILE
  342.     tail -1 $SYSLOGFILE > $LASTSYSLOG
  343.     echo "SYSLOG|End" >> $DIAGREPFILE
  344. fi
  345.  
  346. set `/sbin/stat -mq /var/inst/hist $SAVEDIR/versions 2>/dev/null` >/dev/null
  347. if [ ! -r $SAVEDIR/versions -o \( "$2" -a "$1" -gt "$2" \) ] ; then
  348.     checkandappend versions VERSIONS /usr/sbin/versions -n eoe.sw.unix support.sw.fru "patchSG*"
  349.     touch $SAVEDIR/versions
  350. fi
  351. if $AMCONFIG hinvupdate ; then
  352.     checkandappend hinv HINV /usr/bin/hinv -mvv
  353.     checkandappend gfxinfo GFXINFO /usr/gfx/gfxinfo -vv
  354. else
  355.     echo "HINV|Begin\nunknown\nHINV|End" >> $DIAGREPFILE
  356.     echo "GFXINFO|Begin\nunknown\nGFXINFO|End" >> $DIAGREPFILE
  357. fi
  358.  
  359. if [ "$DIAGTYPE" != "STATUS" ] ; then
  360.     NOTIFYOPTIONS=" -c $AUTOEMAILLIST"
  361. else
  362.     NOTIFYOPTIONS=" -c $AUTOEMAILLIST -a $AVAILREPFILE"
  363. fi
  364.  
  365. if [ $NOINSTE -eq 0 ] ; then
  366.     NOTIFYOPTIONS="$NOTIFYOPTIONS -i $DIAGREPFILE"
  367. else
  368.     NOTIFYOPTIONS="$NOTIFYOPTIONS -d $DIAGREPFILE"
  369. fi
  370.  
  371. if [ $SERIALNUM != "unknown" ] ; then
  372.     if $AMCONFIG autoemail ; then
  373.     $AMNOTIFY $NOTIFYOPTIONS &
  374.     fi
  375. fi
  376.  
  377. rm -f $TMPFILE $DIFFFILE
  378.